﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KaartenLib
{

    public class Kaart : IComparable<Kaart>, ICloneable{

        Boolean zichtbaar = false;
        KaartWaarde waarde;
        KaartSoort soort;

        public Kaart(KaartSoort soort,KaartWaarde waarde) {
            this.waarde = waarde;
            this.soort = soort;
        }

        public Kaart(String soort, String waarde)
        {
            this.WaardeString = waarde;
            this.SoortString = soort;
        }

        public Kaart() { }
        public KaartWaarde Waarde{
            get{
                return waarde;
            }
            set{
                waarde = value;
            }
        }

        public String WaardeString
        {
            set
            {
                switch (value)
                {
                    case "Aas": waarde = KaartWaarde.Aas;
                        break;
                    case "Twee": waarde = KaartWaarde.Twee;
                        break;
                    case "Drie": waarde = KaartWaarde.Drie;
                        break;
                    case "Vier": waarde = KaartWaarde.Vier;
                        break;
                    case "Vijf": waarde = KaartWaarde.Vijf;
                        break;
                    case "Zes": waarde = KaartWaarde.Zes;
                        break;
                    case "Zeven": waarde = KaartWaarde.Zeven;
                        break;
                    case "Acht": waarde = KaartWaarde.Acht;
                        break;
                    case "Negen": waarde = KaartWaarde.Negen;
                        break;
                    case "Tien": waarde = KaartWaarde.Tien;
                        break;
                    case "Boer": waarde = KaartWaarde.Boer;
                        break;
                    case "Dame": waarde = KaartWaarde.Dame;
                        break;
                    case "Heer": waarde = KaartWaarde.Heer;
                        break;
                    default: throw new ArgumentException("Moet een kaartsoort zijn.");
                }
            }
        }
        public String SoortString
        {
            set
            {
                switch (value)
                {
                    case "Harten": soort = KaartSoort.Harten;
                        break;
                    case "Klaveren": soort = KaartSoort.Klaveren;
                        break;
                    case "Ruiten": soort = KaartSoort.Ruiten;
                        break;
                    case "Schoppen": soort = KaartSoort.Schoppen;
                        break;
                    default: throw new ArgumentException("Moet een kaartsoort zijn.");
                }
            }
        }

        public KaartSoort Soort{
            get{
                return soort;
            }
            set{
                soort = value;
            }
        }

        public Boolean Zichtbaar{
            get{
                return Zichtbaar;
            }
            set { zichtbaar = value; }
        }

        public void DraaiOm() { 
            zichtbaar = !zichtbaar;
        }        

        public override string ToString() {
            return soort + " " + waarde;
        }

        public override int GetHashCode() {
            return ((int)soort * 13) + (int)waarde;
        }

        public int CompareTo(Kaart other)
        {
            return (int)this.Waarde - (int)other.Waarde;
        }

        public object Clone()
        {
            return base.MemberwiseClone();
        }

        public override bool Equals(Object objectt)
        {
            if (objectt is Kaart)
            {
                if (((Kaart)objectt).soort.Equals(this.soort) && ((Kaart)objectt).waarde.Equals(this.waarde))
                {
                    return true;
                }
            }
            return false;
        }

        public Boolean isBeeldje()
        {
            return this.waarde == KaartWaarde.Boer || this.waarde == KaartWaarde.Dame || this.waarde == KaartWaarde.Heer || this.waarde == KaartWaarde.Aas;
        }

        public List<String> getWaarde()
        {
            List<String> waardes = new List<String>();
            if (this.isBeeldje())
            {
                if (this.Waarde == KaartWaarde.Boer)
                {                    
                    waardes.Add("1");
                }else if (this.Waarde == KaartWaarde.Dame){
                    waardes.Add("2");
                }else if (this.Waarde == KaartWaarde.Heer){
                    waardes.Add("3");
                }else if(this.Waarde == KaartWaarde.Aas){
                    waardes.Add("11");
                }
            }            
            waardes.Add(this.Waarde.ToString());
            return waardes;
        }
    }

    public enum KaartWaarde { 
        Aas    =1,
        Twee   =2,
        Drie   =3,
        Vier   =4,
        Vijf   =5,
        Zes    =6,
        Zeven  =7,
        Acht   =8,
        Negen  =9,
        Tien  =10,
        Boer  =11,
        Dame  =12,
        Heer  =13
    }

    public enum KaartSoort { 
        Harten,
        Ruiten,
        Klaveren,
        Schoppen
    }   
}
